package com.tp2.etna.distribucion1.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.mysql.jdbc.CallableStatement;
import com.tp2.etna.distribucion1.constante.GeneralConstante;
import com.tp2.etna.distribucion1.modelo.EstadoHojaRutaDetalleModel;
import com.tp2.etna.distribucion1.modelo.EstadoHojaRutaModel;
import com.tp2.etna.distribucion1.modelo.HojaRutaDetalleModel;
import com.tp2.etna.distribucion1.modelo.HojaRutaModel;

@Repository
public class HojaRutaDAOImpl implements HojaRutaDAO {

	@Autowired
    private DataSource dataSource;
	
	public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
	
	@Override
	public List<HojaRutaModel> listar(Date fecha, String numero,
			int idZonaDespacho, int idEstadoHojaRuta) {
		
		String query = "SELECT hr.codigo"
				+ ",hr.numero"
				+",hr.fecha"
				+",hr.idEstadoHojaRuta"
				+",ehr.descripcion"
				+",hr.transporteDisponible"
				+",hr.idZonaDespacho "
				+",zd.descripcion"
				+",hr.idTransporte"
				+",t.placa"
				+",t.modelo"
				+",hr.fechaGeneracion"
				+" FROM HOJARUTA hr" 
				+" INNER JOIN ZONADESPACHO zd"
				+" ON hr.idZonaDespacho = zd.codigo"
				+" INNER JOIN ESTADOHOJARUTA ehr"
				+" ON hr.idEstadoHojaRuta = ehr.codigo"
				+" INNER JOIN TRANSPORTE t"
				+" ON hr.idTransporte = t.codigo"
				+" WHERE hr.fecha = ?";
				
		
		if(!numero.equals(GeneralConstante.CADENA_VACIA))
	 	{
	 		query = query 
	 				+" AND hr.numero = ?";
					
	 		
	 	}
 
	 	if(idZonaDespacho > 0)
	 	{
	 		query = query 
	 				+" AND (zd.codigo = ?)";
					
	 		
	 	}
	 	
	 	if(idEstadoHojaRuta > 0)
	 	{
	 		query = query 
	 				+" AND e.idEstadoEntrega = ?";
	 	}
  
    List<HojaRutaModel> lista = new ArrayList<HojaRutaModel>();
    HojaRutaModel hojaRuta = null;
    Connection con = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try{
        con = dataSource.getConnection();
        ps = con.prepareStatement(query);
        ps.setDate(1, fecha);
              
        int contador = 2;
        
        if(!numero.equals(GeneralConstante.CADENA_VACIA))
	 	{
        	  ps.setString(2, numero);
        	  contador++;	
	 		
	 	}
        
        if(idZonaDespacho > 0)
	 	{
        	ps.setInt(contador, idZonaDespacho);
        	contador++;
           
	 	}
        
        if(idEstadoHojaRuta > 0)
	 	{
        	 ps.setInt(contador, idEstadoHojaRuta);
	 	}
	 	          
        rs = ps.executeQuery();
        while(rs.next()){
        	
        	hojaRuta = new HojaRutaModel();
        	hojaRuta.setCodigo(rs.getInt("hr.codigo"));
        	hojaRuta.setNumero(rs.getString("hr.numero"));
        	hojaRuta.setFecha(rs.getDate("hr.fecha"));
        	hojaRuta.setIdEstadoHojaRuta(rs.getInt("hr.idEstadoHojaRuta"));
        	hojaRuta.setEstadoHojaRuta(rs.getString("ehr.descripcion"));
        	hojaRuta.setTransporteDisponible(rs.getString("hr.transporteDisponible"));
        	hojaRuta.setIdZonaDespacho(rs.getInt("hr.idZonaDespacho"));
        	hojaRuta.setZonaDespacho(rs.getString("zd.descripcion"));
        	hojaRuta.setIdTransporte(rs.getInt("hr.idTransporte"));
        	hojaRuta.setPlaca(rs.getString("t.placa"));
        	hojaRuta.setModelo(rs.getString("t.modelo"));
        	hojaRuta.setFechaGeneracion(rs.getDate("hr.fechaGeneracion"));
        	  
        	//Obtener cubicaje del detalle
        	List<HojaRutaDetalleModel> listarHojaRutaDetalle =  listarHojaRutaDetalle(hojaRuta.getCodigo());
        	Double cubicajeTotal = GeneralConstante.DOUBLE_CERO;
        	
        	for (HojaRutaDetalleModel detalle : listarHojaRutaDetalle) {
        		cubicajeTotal = cubicajeTotal + detalle.getCubicaje();
			}
        	
        	hojaRuta.setCubicaje(cubicajeTotal);
        	
            lista.add(hojaRuta);
            
        }
        
        
        
    }catch(SQLException e){
        e.printStackTrace();
    }finally{
        try {
            rs.close();
            ps.close();
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    return lista;
		
	}

	@Override
	public List<EstadoHojaRutaModel> listarEstado() {
		
		String query = "SELECT codigo"
				+ ",descripcion"
				+ ",abreviatura"
				+" FROM ESTADOHOJARUTA";				
					 
	     List<EstadoHojaRutaModel> lista = new ArrayList<EstadoHojaRutaModel>();
	     EstadoHojaRutaModel estadoHojaRuta = null;
	     
	     estadoHojaRuta = new EstadoHojaRutaModel();
	     estadoHojaRuta.setCodigo(0);
	     estadoHojaRuta.setDescripcion("[Todos]");
	     estadoHojaRuta.setAbreviatura(GeneralConstante.CADENA_VACIA);
    	 
    	 lista.add(estadoHojaRuta);
	     
	     Connection con = null;
	     PreparedStatement ps = null;
	     ResultSet rs = null;
	     try{
	         con = dataSource.getConnection();
	         ps = con.prepareStatement(query);
	                   
	         rs = ps.executeQuery();
	         while(rs.next()){
	        	 estadoHojaRuta = new EstadoHojaRutaModel();
	        	 estadoHojaRuta.setCodigo(rs.getInt("codigo"));
	        	 estadoHojaRuta.setDescripcion(rs.getString("descripcion"));
	        	 estadoHojaRuta.setAbreviatura(rs.getString("abreviatura"));
	         
	             lista.add(estadoHojaRuta);
	             
	         }
	         
	     }catch(SQLException e){
	         e.printStackTrace();
	     }finally{
	         try {
	             rs.close();
	             ps.close();
	             con.close();
	         } catch (SQLException e) {
	             e.printStackTrace();
	         }
	     }
	     return lista;
		
	}

	@Override
	public List<HojaRutaDetalleModel> listarHojaRutaDetalle(int idHojaRuta) {
		
		String query = "SELECT det.idHojaRutaDetalle"
						+ ",det.nroItem"
						+",det.cubicaje"
						+",det.peso"
						+",det.fechaUltimoEstado"
						+",det.idEstadoHojaRutaDetalle"
						+",est.descripcion"
						+",det.idHojaRuta"
						+",det.idEntrega"
						+",e.idCliente"
						+",c.nombre"
						+",e.idDireccion"
						+",d.direccion"
						+",e.idMotivoTraslado"
						+",mt.descripcion"
						+" FROM HOJARUTADETALLE det" 
						+" INNER JOIN ENTREGA e"
						+" ON det.idEntrega = e.codigo"
						+" INNER JOIN CLIENTE c"
						+" ON e.idCliente = c.codigo"
						+" INNER JOIN DIRECCION d"
						+" ON e.idDireccion = d.codigo"
						+" INNER JOIN MOTIVOTRASLADO mt"
						+" ON e.idMotivoTraslado = mt.codigo"
						+" INNER JOIN ESTADOHOJARUTADETALLE est"
						+" ON det.idEstadoHojaRutaDetalle = est.codigo"
						+" WHERE det.idHojaRuta = ?";
 
		    List<HojaRutaDetalleModel> lista = new ArrayList<HojaRutaDetalleModel>();
		    HojaRutaDetalleModel hojaRutaDetalle = null;
		    Connection con = null;
		    PreparedStatement ps = null;
		    ResultSet rs = null;
		    try{
		        con = dataSource.getConnection();
		        ps = con.prepareStatement(query);
		        ps.setInt(1, idHojaRuta);
		               
		        rs = ps.executeQuery();
		        while(rs.next()){
		        	
		        	hojaRutaDetalle = new HojaRutaDetalleModel();
		        	hojaRutaDetalle.setIdHojaRutaDetalle(rs.getInt("det.idHojaRutaDetalle"));
		        	hojaRutaDetalle.setNroItem(rs.getInt("det.nroItem"));	
		        	hojaRutaDetalle.setCubicaje(rs.getDouble("det.cubicaje"));
		        	hojaRutaDetalle.setPeso(rs.getDouble("det.peso"));
		        	hojaRutaDetalle.setFechaUltimoEstado(rs.getDate("det.fechaUltimoEstado"));
		        	hojaRutaDetalle.setIdEstadoHojaRutaDetalle(rs.getInt("det.idEstadoHojaRutaDetalle"));
		        	hojaRutaDetalle.setEstadoHojaRutaDetalle(rs.getString("est.descripcion"));
		        	hojaRutaDetalle.setIdHojaRuta(rs.getInt("det.idHojaRuta"));
		        	hojaRutaDetalle.setIdEntrega(rs.getInt("det.idEntrega"));
		        	hojaRutaDetalle.setIdCliente(rs.getInt("e.idCliente"));
		        	hojaRutaDetalle.setClienteNombre(rs.getString("c.nombre"));
		        	hojaRutaDetalle.setIdDireccion(rs.getInt("e.idDireccion"));
		        	hojaRutaDetalle.setDireccionDescripcion(rs.getString("d.direccion"));
		        	hojaRutaDetalle.setIdMotivoTraslado(rs.getInt("e.idMotivoTraslado"));
		        	hojaRutaDetalle.setMotivoTraslado(rs.getString("mt.descripcion"));
		        	
		            lista.add(hojaRutaDetalle);
		            
		        }
		        
		    }catch(SQLException e){
		        e.printStackTrace();
		    }finally{
		        try {
		            rs.close();
		            ps.close();
		            con.close();
		        } catch (SQLException e) {
		            e.printStackTrace();
		        }
		    }
		    return lista;
		
	}

	@Override
	public boolean modificarHojaRuta(Date fecha, String transporteDisponible,
			int idHojaRuta) {
		
		String query = "UPDATE HOJARUTA SET fecha=?,transporteDisponible = ? WHERE codigo=?";
		
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setDate(1, fecha);
            ps.setString(2, transporteDisponible);
            ps.setInt(3, idHojaRuta);
            int out = ps.executeUpdate();
            if(out !=0){
            	return true;
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
		
	}

	@Override
	public boolean modificarDetalleHojaRuta(int idEstadoDetalle, int idDetalle) {
		
		String query = "UPDATE HOJARUTADETALLE SET idEstadoHojaRutaDetalle=? WHERE idHojaRutaDetalle=?";
		
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idEstadoDetalle);
            ps.setInt(2, idDetalle);
            int out = ps.executeUpdate();
            if(out !=0){
            	return true;
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
		
	}

	@Override
	public boolean eliminarHojaRuta(int idHojaRuta) {
		
		String query = "UPDATE HOJARUTA SET idEstadoHojaRuta=2 WHERE codigo=?";
		
        Connection con = null;
        PreparedStatement ps = null;
        try{
            con = dataSource.getConnection();
            ps = con.prepareStatement(query);
            ps.setInt(1, idHojaRuta);
            int out = ps.executeUpdate();
            if(out !=0){
            	return true;
            }
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
                ps.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
		
	}

	@Override
	public boolean generarHojaRuta(Date fechaInicio, Date fechaFin) {
		
		Connection con = null;
        CallableStatement cs = null;
        boolean resultado = false;
        try{
            con = dataSource.getConnection();
            cs = (CallableStatement) con.prepareCall("{call generarHojaRuta(?,?)}");
            cs.setDate(1, fechaInicio);
            cs.setDate(2, fechaFin);
            
            resultado = cs.execute();
            
        }catch(SQLException e){
            e.printStackTrace();
        }finally{
            try {
            	cs.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return resultado;
		
	}

	
	@Override
	public List<EstadoHojaRutaDetalleModel> listarEstadoDetalle() {
		String query = "SELECT codigo"
				+ ",descripcion"
				+ ",abreviatura"
				+" FROM ESTADOHOJARUTA";				
					 
	     List<EstadoHojaRutaDetalleModel> lista = new ArrayList<EstadoHojaRutaDetalleModel>();
	     EstadoHojaRutaDetalleModel estadoDetalle = null;
	     
	     Connection con = null;
	     PreparedStatement ps = null;
	     ResultSet rs = null;
	     try{
	         con = dataSource.getConnection();
	         ps = con.prepareStatement(query);
	                   
	         rs = ps.executeQuery();
	         while(rs.next()){
	        	 estadoDetalle = new EstadoHojaRutaDetalleModel();
	        	 estadoDetalle.setCodigo(rs.getInt("codigo"));
	        	 estadoDetalle.setDescripcion(rs.getString("descripcion"));
	        	 estadoDetalle.setAbreviatura(rs.getString("abreviatura"));
	         
	             lista.add(estadoDetalle);
	             
	         }
	         
	     }catch(SQLException e){
	         e.printStackTrace();
	     }finally{
	         try {
	             rs.close();
	             ps.close();
	             con.close();
	         } catch (SQLException e) {
	             e.printStackTrace();
	         }
	     }
	     return lista;
	}

}
